package com.tianjin.design.observer;

/**
 *
 * @author tianjin
 *
 * 2023年6月1日
 * TODO 观察者模式# 行为型模式，也叫做发布-订阅模式
 *
 * 1、理解：观察者模式又叫做发布订阅模式，顾名思义，我自己是这么理解的，如下，观察者在收到主题通知后，将采取一个动作，所以观察者模式的两大组件是观察者和通知者（主题）
 * 2、多个观察者监听同一个主题，当主题状态发生变化时，通知所有观察者，观察者会更新自身信息
 * 3、使用场景: 如果为了降低耦合性，将一系列协作的类分割开来，就会导致维护困难，但是又不想增加耦合性，此时可以考虑观察者模式，
 * 		观察者模式中观察者和主题无需互相对彼此了解，只需要知道主题状态变化了，就通知观察者，具体观察者怎么处理观察者自己处理就可以了
 * 4、代码实现思路：
 * 		4-1 两大组件观察者和主题
 * 		4-2 定义主题抽象类 Subject，定义主题中的方法模板
 * 		4-3 定义观察者抽象类，Observer，定义观察者的方法模板
 * 		4-4 创建实际的观察者和主题，用来实现，自习课上同学们在玩耍，班长守门，当老师来了，班长通知同学们抓紧学习
 * 		4-5 客户端模拟，如下方main
 *
 *
 */
public class Test {


	public static void main(String[] args) {

		// 绑定观察者
		LeadSubject subject = new LeadSubject();
		subject.setName("我是班长王大胆，正在监听.....");

		subject.add(new StudentObserver("111111"));
		subject.add(new StudentObserver("222222"));
		subject.add(new StudentObserver("333333"));
		subject.add(new StudentObserver("444444"));
		subject.add(new StudentObserver("555555"));

		System.out.println(subject.getName());
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 老师来了，通知所有人
		System.out.println("两秒钟后，老师来了，我要通知了，同学们赶紧做出调整");

		subject.notifyObserver();


	}
}
